<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        console.log('200'/4); // 50  这里边涉及到隐式转换 
        // js 帮我们 偷偷地改变了数据类型 

        // 所以我们需要搞清楚  隐式转换的规则

        //  其它数据类型==> 字符串

        // 三种方法 
        // 1. + 加号运算符
        // 2. String()
        // 3. toString()

        // 第一种
        var a = 123;  // Number 类型
        console.log(a + '');  // 转换成 String 类型 '123'
        console.log(a + 'haha');  // 转换成 String 类型  '123haha'

        // 第二种 toString()
        var num = 255;
        var flag = true;
        var b;
        var c = null;
        console.log(num.toString()); // 字符串255
        console.log(flag.toString()); // 字符串 true
        // console.log(b.toString()); // Cannot read property 'toString' of undefined 报错
        // undefined和null   没有 tostring()  这个方法

        // 第三种 String()  推荐  隐式转换中采用的是这个规则
        // 使用 String()函数做强制类型转换时：

        // 对于 Number 和 Boolean 而言，实际上就是调用 toString()方法。

        // 但是对于 null 和 undefined，就不会调用 toString()方法。它会将 null 直接转换为 "null"。将 undefined 直接转换为 "undefined"。

        console.log(String(undefined)); // undefined 字符串
        console.log(b);

        // 总结一下: 其它数据类型 转换成字符串 ,对于 布尔值和数字转换时 三种方法一致,但是String()这个方法可以转换 undefined  和 null 





        // =================================================================== 

        //  其它数据类型===> 布尔值  Boolean() 隐式转换采用
        // 字符串转布尔值  
        var text = '你好';
        console.log(Boolean(text));  // true 布尔值 
        // 空字符串 会转换成 false 
        console.log(Boolean('')); // false
        console.log(Boolean(' ')); // true
        // 数字转布尔值  除了0和NaN，其余的都是true
        console.log(Boolean(0));  // false  
        // undefined null 转布尔值  null和undefined都会转换为false。
        
        // 空字符串, 0 ,NaN ,undefined ,null  会被转换成 false  ,其余都是true 


        // ===================================================== 

        //  其它数据类型==> 数字

        // 使用 Number()函数  隐式转换采用

        // 情况一：字符串 --> 数字
        // 1.如果字符串中是纯数字('1213')，则直接将其转换为数字。
        // 2.如果字符串中有非数字的内容('12a31')，则转换为 NaN。（此处可以看到 Number()函数的局限性）
        // 3.如果字符串是一个空串或者是一个全是空格的字符串，则转换为 0。

        // 情况二：布尔 --> 数字
        // true 转成 1
        // false 转成 0

        // 情况三：null --> 数字
        // 结果为：0

        // 情况四：undefined --> 数字
        // 结果为：NaN


        console.log(213+'你好'); // '213你好'
        console.log(String(null));  // 'null'  原来长什么样还是什么样,只不过变成了字符串类型

        console.log(Boolean(NaN)); // false

        console.log(5 + true); // 6
        console.log(5+ undefined);  // NaN
        console.log('5'+null); // 进行字符串拼接 5null

        // js的不严谨

        // 总结:  String()
        // Boolean() 记好5中转成false 的情况
        // Number() 

    </script>
</body>
</html>